/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package SuperMarket_package;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;





/**
 *
 * @author despoina
 */
public class DBManager {
    
          // Το όνομα της Β.Δ.
    final private String database = "SuperMarket_DB";
    // Το όνομα χρήστη για σύνδεση στη βάση
    final private String user = "pli24";
    // Ο κωδικός για σύνδεση στη βάση
    final private String password = "pli24";
    final private String driver = "org.apache.derby.jdbc.ClientDriver";
    final private String connString = "jdbc:derby://localhost:1527/";
    private Connection connection;
    private PreparedStatement selectCustomer;
    private PreparedStatement selectStores;
    private PreparedStatement insertStore;
    private PreparedStatement updateStore;    
    private PreparedStatement findStore;  
    private PreparedStatement deleteStore; 
    private PreparedStatement selectProducts;
    private PreparedStatement insertProduct;
    private PreparedStatement updateProduct; 
    private PreparedStatement findProduct;  
    private PreparedStatement deleteProduct;
    public PreparedStatement findCustomers;
    public PreparedStatement findCreditCard;
    public PreparedStatement findCustCard;
    public PreparedStatement insertCustomer;
     public PreparedStatement insertCreditCard;
    DBManager() throws SQLException{

        try {
            // Φορτώνει database driver class
            Class.forName(driver);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            // Σύνδεση στη database
            connection = DriverManager.getConnection(connString + database, user, password);            
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
      // Προπαρασκευασμένο statement για την επιλογή ενός συγκεκριμένου χρήστη με συγκεκριμένο login-password από τη βάση.
            selectCustomer = connection.prepareStatement("SELECT * FROM PLI24.CUSTOMER WHERE POINTS_CARD_NUMBER=? AND PASSWORD=?");
      // Προπαρασκευασμένο statement για την επιλογή ολων των καταστηματων
            selectStores = connection.prepareStatement("SELECT * FROM PLI24.STORE ");
    // Προπαρασκευασμένο statement για την εισαγωγη καταστηματος
            insertStore = connection.prepareStatement("INSERT INTO PLI24.STORE(NAME,ADDRESS)VALUES (?,?)");
   // Προπαρασκευασμένο statement για την ενημερωση καταστηματος
            updateStore= connection.prepareStatement("UPDATE PLI24.STORE SET NAME=?, ADDRESS=? WHERE STORE_ID=?");
     // Προπαρασκευασμένο statement για την επιλογή ενός καταστήματος με συγκεκριμένο id από τη βάση.
            findStore = connection.prepareStatement("SELECT * FROM PLI24.STORE WHERE STORE_ID=? ");
    // Προπαρασκευασμένο statement για την διαγραφη ενός καταστήματος με συγκεκριμένο id από τη βάση.
           deleteStore = connection.prepareStatement("DELETE  FROM PLI24.STORE WHERE STORE_ID=? ");
    // Προπαρασκευασμένο statement για την επιλογή ολων των προιοντων
            selectProducts = connection.prepareStatement("SELECT * FROM PLI24.PRODUCT ");
     // Προπαρασκευασμένο statement για την εισαγωγη καταστηματος
            insertProduct = connection.prepareStatement("INSERT INTO PLI24.PRODUCT(NAME,CODE,POINTS,PRICE)VALUES (?,?,?,?)");
   // Προπαρασκευασμένο statement για την ενημερωση προϊόντος
            updateProduct= connection.prepareStatement("UPDATE PLI24.PRODUCT SET NAME=?, CODE=? , POINTS=? ,PRICE=? WHERE PRODUCT_ID=?");
     // Προπαρασκευασμένο statement για την επιλογή ενός προϊόντος με συγκεκριμένο id από τη βάση.
            findProduct = connection.prepareStatement("SELECT * FROM PLI24.PRODUCT WHERE PRODUCT_ID=? ");
    // Προπαρασκευασμένο statement για την διαγραφη ενός προϊόντος με συγκεκριμένο id από τη βάση.
           deleteProduct = connection.prepareStatement("DELETE  FROM PLI24.PRODUCT WHERE PRODUCT_ID=? ");
    // Προπαρασκευασμένο statement για την επιλογή των πελατων απο την βαση.
            findCustomers = connection.prepareStatement("SELECT * FROM PLI24.CUSTOMER ");
    // Προπαρασκευασμένο statement για την επιλογή ολων των πιστωτικων καρτων της βασης
            findCreditCard= connection.prepareStatement("SELECT * FROM PLI24.CREDIT_CARD ");
        // Προπαρασκευασμένο statement για την εισαγωγη πελατη
            insertCustomer = connection.prepareStatement("INSERT INTO PLI24.CUSTOMER (FIRST_NAME, LAST_NAME,ADDRESS, PASSWORD,POINTS_CARD_NUMBER,AVAILABLE_POINTS) VALUES (?,?,?,?,?,?)");
      // Προπαρασκευασμένο statement για την εισαγωγη πιστωτικης καρτας πελάτη
            insertCreditCard = connection.prepareStatement("INSERT INTO PLI24.CREDIT_CARD (BANK,OWNER,NUMBER,CVV)  VALUES (?,?,?,?)");
    }  
       
    // Αναζητηση user με συγκεκριμενο username, password
    public Customer ReadCustomer(String username, String password){
        try {
            selectCustomer.setString(1, username);
            selectCustomer.setString(2, password);

            ResultSet rs = selectCustomer.executeQuery();
            while (rs.next()){
               Customer cu = new Customer(rs.getInt("USER_ID"), rs.getString("FIRST_NAME"),rs.getString("LAST_NAME"),rs.getString("POINTS_CARD_NUMBER"),rs.getInt("AVAILABLE_POINTS"),rs.getString("PASSWORD"));
                return cu;
            }
            return null;
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    //Διαβάζει απο την βάση τα διαθέσιμα καταστήματα
    public ArrayList<Store> readStores(){
        ArrayList<Store> StoresList = new ArrayList<Store>();
        try {            
            ResultSet rs = selectStores.executeQuery();
            while (rs.next()){
                Store st = new Store(rs.getInt("STORE_ID"), rs.getString("NAME"),  rs.getString("ADDRESS"));
                       
                StoresList.add(st);
            }
            return StoresList.isEmpty()?null:StoresList;
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

// Αποθηκεύει στην βαση το καταστημα
        public void saveStore(Store st) {
        try {
           
            insertStore.setString(1, st.getAddress());
            insertStore.setString(2,st.getName());
            insertStore.executeUpdate();
        } catch (Exception ex) {            
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }

         }  
     //ενημερώνει ενα καταστημα στην ΒΔ   
    public void updateStore(Store st,int id){
        try {
           
            updateStore.setString(1,st.getName());
            updateStore.setString(2,st.getAddress());
            updateStore.setInt(3, id);
            updateStore.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
       public Store findStore(int id){
        try {
            findStore.setInt(1, id);
           
            ResultSet rs = findStore.executeQuery();
            while (rs.next()){
               Store st = new Store(rs.getInt("STORE_ID"), rs.getString("NAME"),rs.getString("ADDRESS"));
                return st;
            }
            return null;
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    } 
       //διαγραφει ενα καταστημα στην ΒΔ   
       public void deleteStore(int id){
        try {                    
            deleteStore.setInt(1, id);
            deleteStore.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
       //Διαβάζει απο την βάση τα διαθέσιμα προιοντα
    public ArrayList<Product> readProducts(){
        ArrayList<Product> ProductsList = new ArrayList<Product>();
        try {            
            ResultSet rs = selectProducts.executeQuery();
            while (rs.next()){
                Product pr= new Product(rs.getInt("PRODUCT_ID"), rs.getString("NAME"),  rs.getString("CODE"),rs.getInt("POINTS"),rs.getFloat("PRICE"));
                       
                ProductsList.add(pr);
            }
            return ProductsList.isEmpty()?null:ProductsList;
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    } 
    // Αποθηκεύει στην βαση το καταστημα
        public void saveProduct(Product pr) {
        try {
           
            insertProduct.setString(1, pr.getName());
            insertProduct.setString(2,pr.getCode());
            insertProduct.setInt(3,pr.getPoints());
            insertProduct.setFloat(4, pr.getPrice());
            insertProduct.executeUpdate();
        } catch (Exception ex) {            
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
         }  
 //ενημερώνει ενα προιον στην ΒΔ   
    public void updateProduct(Product pr,int id){
        try {
           
            updateProduct.setString(1,pr.getName());
            updateProduct.setString(2,pr.getCode());
            updateProduct.setInt(3,pr.getPoints());
            updateProduct.setFloat(4, pr.getPrice());
            updateProduct.setInt(5, id);
            updateProduct.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public Product findProduct(int id){
        try {
            findProduct.setInt(1, id);
           
            ResultSet rs = findProduct.executeQuery();
            while (rs.next()){
              Product pr = new Product(rs.getInt("PRODUCT_ID"), rs.getString("NAME"),rs.getString("CODE"),rs.getInt("POINTS"),rs.getFloat("PRICE"));
                return pr;
            }
            return null;
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    } 
    //διαγραφει ενα καταστημα στην ΒΔ   
       public void deleteProduct(int id){
        try {                    
            deleteProduct.setInt(1, id);
            deleteProduct.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 //Διαβάζει απο την βάση τους διαθεσιμους πελατες
    public ArrayList<Customer> findCustomers(){
        ArrayList<Customer> CustomersList = new ArrayList<Customer>();
        
       try {            
           ResultSet rs = findCustomers.executeQuery();
            while (rs.next()){
               Customer cu = new Customer(rs.getInt("USER_ID"),rs.getString("FIRST_NAME"),rs.getString("LAST_NAME"),rs.getString("POINTS_CARD_NUMBER"),rs.getInt("AVAILABLE_POINTS"),rs.getInt("NOOFCHECKS"),rs.getString("ADDRESS"),rs.getString("PASSWORD"));
               CustomersList.add(cu);
                 }
           return CustomersList.isEmpty()?null:CustomersList;
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
            return null;   
    }
    }
   //Διαβαζει απο την βαση την πιστωτικη καρτα ενος συγκεκριμενου πελατη
     public ArrayList<CreditCard>  findCreditCard(){
      ArrayList<CreditCard> CreditCardList = new ArrayList<CreditCard>();
        
       try {            
           ResultSet rs = findCreditCard.executeQuery();
            while (rs.next()){
             
                CreditCard crca = new CreditCard(rs.getInt("CARD_ID"),rs.getString("CVV"),rs.getString("NUMBER"),rs.getString("OWNER"),rs.getInt("BANK"),rs.getInt("CUST_ID"));       
             CreditCardList.add(crca );
        
            }
           return CreditCardList.isEmpty()?null:CreditCardList;
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
            return null;
       
    }
    }
     // Αποθηκεύει στην βαση το καταστημα
        public void saveCustomer(Customer cu) {
        try {
           
             insertCustomer.setString(1,cu.getFirstName());
             insertCustomer.setString(2,cu.getLastName());
             insertCustomer.setString(3, cu.getAddress());
             insertCustomer.setString(4,cu.getPassword());
             insertCustomer.setString(5,cu.getPointsCardNumber());
             insertCustomer.setInt(6, cu.getAvailablePoints());
             insertCustomer.executeUpdate();
        } catch (Exception ex) {            
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
         }  
         // Αποθηκεύει στην βαση το καταστημα
        public void saveCreditCard(CreditCard cr) {
        try {
           
             insertCreditCard .setInt(1,cr.getBank());
             insertCreditCard .setString(2,cr.getOwner());
             insertCreditCard .setString(3,cr.getNumber());
             insertCreditCard .setString(4,cr.getCvv());
             insertCreditCard .executeUpdate();
        } catch (Exception ex) {            
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
         }  
}

   
  
     

